package com.example.demo.controller;

import com.alibaba.druid.support.http.util.IPAddress;
import com.example.demo.dao.StuJpaDao;
import com.example.demo.entity.Student;
import com.example.demo.entity.Stus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.UUID;

//JPA相关的接口控制类
@RestController
@RequestMapping("/jpa")//给该类的所有路径添加前缀
public class JpaController {

    @Autowired
    StuJpaDao stuJpaDao;
    //返回所有学生信息 json格式的方式返回
    //调用方式 http://localhost:8080/getAllJpa
    //[{"name":"蓝鸟","id":1,"sex":"男","classId":1},{"name":"黄","id":2,"sex":"男","classId":1},{"name":"海","id":3,"sex":"女","classId":2},{"name":"李","id":4,"sex":"女","classId":2},{"name":"张","id":5,"sex":"女","classId":2}]

    @GetMapping("/getAllJpa")
    public List<Student> getAllJpa() {
        return stuJpaDao.findAll();//获取所有学生信息
    }



    //更新指定ID的学生信息
    //调用方式 http://localhost:8080/updateJpa?id=1&name=lan
    @GetMapping("/updateJpa")
    public String updateJpa(int id, String name) {
        Student student = stuJpaDao.findById(id).get();
        student.setName(name);
        Student result = stuJpaDao.save(student);
        if (result != null) {
            return "更新成功";
        } else {
            return "更新失败";
        }
    }

    //插入学生信息，接收前端的三个参数，name，sex classId
    //调用方式 http://localhost:8080/insertJpa?name=ss&sex=男&classId=1
    @GetMapping("/insertJpa")
    public String insertJpa(String name, String sex, int classId) {
        Student xiaohua = new Student();
        xiaohua.setName(name);
        xiaohua.setSex(sex);
        xiaohua.setClassId(classId);
        Student result = stuJpaDao.save(xiaohua);
        if (result != null) {
            return "插入成功";
        } else {
            return "插入失败";
        }
    }


    @GetMapping("/getOne")
    public Student getOnes() {

        Student result = stuJpaDao.getStu(1, "男");
        return result;


    }


    //更新指定ID的学生信息
    //调用方式 http://localhost:8080/updateJpa?id=1&name=lan
    @GetMapping("/updateJpaSql")
    public String updateJpaSql(int id, String name) {

        int result = stuJpaDao.updateStu(id,name);
        if (result>0) {
            return "更新成功";
        } else {
            return "更新失败";
        }
    }

    //删除指定ID的学生信息
    //调用方式 http://localhost:8080/deleteJpaSql?id=1
    @GetMapping("/deleteJpaSql")
    public String deleteJpaSql(int id) {

        int result = stuJpaDao.deleteSql(id);
        if (result>0) {
            return "删除成功";
        } else {
            return "删除失败";
        }
    }
    //根据学生姓名模糊查询学生列表
    @GetMapping("/getStuByNameJpa")
    public List<Student> getStuByNameJpa(String name) {
        return stuJpaDao.findByNameContaining(name);
    }
    //根据学生姓名模糊查询学生列表并且指定班级的学生
    @GetMapping("/getStuByNameAndClassJpa")
    public List<Student> getStuByNameAndClassJpa(String name,int classId) {
        return stuJpaDao.findByNameContainingAndClassId(name,classId);
    }
    @Autowired
    RedisTemplate redisTemplate;

    //根据学生姓名模糊查询学生列表并且指定年龄的学生
    @GetMapping("/findAllJpaByName")
    @Cacheable(cacheNames = "stuList",key = "'landingsheng'+#name+#age")//cacheNames 类似一个缓存空间名称，会存着不同的查询条件的结果缓存
    //如果对应的查询条件已经查过数据，表明缓存空间会有对应的数据，直接返回缓存中的数据，不查询数据库
    //否则查询数据库
    public List<Student> findByNameContainingAndAge(String name,int age) {
//        List<Student> studentList = (List<Student>)
//                redisTemplate.opsForValue().get("stuList::landingsheng"+name+age);//从缓存拿key的数据
//        if(studentList==null){//缓存没有数据，就查数据库
        List<Student> studentList;
            if(age==0){
                studentList = stuJpaDao.findByNameContaining(name);

            }else {
                studentList = stuJpaDao.findByNameContainingAndAge(name,age);
            }
//            redisTemplate.opsForValue().set("stuList::landingsheng"+name+age,studentList);
            return studentList;
//        }else {
//            return studentList;
//        }

    }

    //删除指定ID的学生信息
    //调用方式 http://localhost:8080/deleteJpa?id=1
    @GetMapping("/deleteJpa")
    @CacheEvict(cacheNames = "stuList",allEntries = true)//删除stuList这个空间的缓存
    public String deleteJpa(int id) {
        stuJpaDao.deleteById(id);
//        redisTemplate.delete("stuList::landingsheng3");
        return "删除成功";
    }



    // 文件上传管理
    @PostMapping("/uploadFile")
    public String uploadFile(MultipartFile file, int id) throws FileNotFoundException, UnknownHostException {
        // 获取文件名以及后缀名
        String fileName = file.getOriginalFilename();
        // 重新生成文件名（根据具体情况生成对应文件名）
        fileName = UUID.randomUUID()+"_"+fileName;
        // 指定上传文件本地存储目录，不存在需要提前创建
        String dirPath =  "D:\\file\\";
        File filePath = new File(dirPath);
        if(!filePath.exists()){//判断文件夹是否存在
            filePath.mkdirs();//不存在就创建文件夹
        }
        File file1=new File(dirPath+fileName);
        try {
            file.transferTo(file1);//最关键的步骤，用来存放文件的
        } catch (Exception e) {
            e.printStackTrace();
            return "上传失败";
        }
        String ipAddress = InetAddress.getLocalHost().getHostAddress();//获取当前机子的IP地址

        Student student = stuJpaDao.findById(id).get();
        //设置新头像，新头像地址是虚拟地址，不能为实际的文件目录地址，前端限制不能访问实际文件地址
        //虚拟地址的配置在config里面配置 IP和端口是自己后台实际运行的IP和端口，images是根据映射关系确定的
        student.setTouxiang("http://"+ipAddress+":8080/images/"+fileName);
        stuJpaDao.save(student);//找到对应的学生，存新的图片回去
        return "上传成功";
    }
}
